(deftemplate culoarePantaloni (slot persoana) (slot culoare))
(deftemplate pozitie (slot persoana) (slot x))

(foreach ?nume (create$ Fred Joe Bob Tom)
	(foreach ?i (create$ 1 2 3 4)
    	(assert (pozitie (persoana ?nume) (x ?i)))    
    )    
)

(foreach ?nume (create$ Fred Joe Bob Tom)
    (foreach ?culoare (create$ Rosu Albastru Verde Oranj)
    	(assert (culoarePantaloni (persoana ?nume) (culoare ?culoare)))
    )
)


(defrule rezolvare
	(pozitie (persoana Fred)(x ?p1))
    (culoarePantaloni (persoana Fred) (culoare ?c1))
    
    (pozitie (persoana ?n & ~Fred) (x ?p & : (eq ?p (+ ?p1 1))))
    (culoarePantaloni (persoana ?n & ~Fred)(culoare Albastru & ~?c1))
    
    
    (pozitie (persoana Joe)(x ?p2 & 2& ~?p1))
    (culoarePantaloni (persoana Joe) (culoare ?c2 & ~?c1))
    
    (pozitie (persoana Bob & ~?n)(x ?p3 & ~?p1 & ~?p & ~?p2))
    (culoarePantaloni (persoana Bob & ~?n) (culoare ?c3 & Verde & ~?c1 & ~?c2))
    
    (pozitie (persoana Tom & ~?n)(x ?p4 & ~1 & ~4 & ~?p1 & ~?p2 & ~?p3))
    (culoarePantaloni (persoana Tom) (culoare ?c4 & ~Oranj & ~?c1 & ~?c2 & ~?c3))
    
    =>
    
    (printout t "Fred pozitie=" ?p1 " culoare= " ?c1 crlf)
    (printout t "Joe pozitie=" ?p2 " culoare= " ?c2 crlf)
    (printout t "Bob pozitie=" ?p3 " culoare= " ?c3 crlf)
    (printout t "Tom pozitie=" ?p4 " culoare= " ?c4 crlf crlf)
    
)

(run)
/*(facts)*/